#include <iostream>
using namespace std;
#include <string>
#include <algorithm>

// STL 标准模板库
//STL从广义上分为 容器 算法 迭代器
//容器和算法之间通过迭代器链接


//vector 容器

#include <vector>

void myPrint10(int val)
{
    cout << val << " ";
}

void test10()
{
    //创建一个vector类型的容器 容器里面存放的数据类型是int 这个其实就是类模板实现的
    vector<int> v;

    //插入数据
    for(int i = 0; i < 4; i++)
    {
        v.push_back(i * 10);
    }

    //通过迭代器访问容器中的数据
    vector<int>::iterator itBegin = v.begin();//其实迭代器 指向容器中第一个元素
    vector<int>::iterator itEnd = v.end();//结束迭代器 指向容器中最后一个元素的下一个位置

    //第一种遍历方式
    while(itBegin != itEnd)
    {
        cout << *itBegin << " ";
        itBegin++;
    }
    cout << endl;

    //第二种遍历方式
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    //第三种遍历方式 使用for_each 要包含算法头文件 #include <algorithm>
    //最后一个参数相当于把 迭代器指向的对象传入函数处理
    for_each(v.begin(), v.end(), myPrint10);
}


//vector 容器存放自定义类型

class Person20
{
public:
    Person20(string name, int age)
    {
        this->age = age;
        this->name = name;
    }

    string name;
    int age;
};

void test20()
{
    vector<Person20> v;
    Person20 p1("Tom1", 21);
    Person20 p2("Tom2", 22);
    Person20 p3("Tom3", 23);
    Person20 p4("Tom4", 24);
    Person20 p5("Tom5", 25);

    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    for(vector<Person20>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << it->name << ": " << it->age << endl;
        cout << (*it).name << ": " << (*it).age << endl;
    }

    //存放自定义数据类型的指针
    vector<Person20*> v1;
    Person20 p11("Jerry1", 21);
    Person20 p12("Jerry2", 22);
    Person20 p13("Jerry3", 23);
    Person20 p14("Jerry4", 24);
    Person20 p15("Jerry5", 25);

    v1.push_back(&p11);
    v1.push_back(&p12);
    v1.push_back(&p13);
    v1.push_back(&p14);
    v1.push_back(&p15);
    for(vector<Person20*>::iterator it = v1.begin(); it != v1.end(); it++)
    {
        cout << (*it)->name << ": " << (*it)->age << endl;
    }

}


//vector  容器嵌套容器

void test30()
{
    vector<vector<int>> v;

    vector<int> v1;
    vector<int> v2;
    vector<int> v3;
    vector<int> v4;
    vector<int> v5;

    for(int i = 0; i < 4; i++)
    {
        v1.push_back(i + 1);
        v2.push_back(i + 2);
        v3.push_back(i + 3);
        v4.push_back(i + 4);
        v5.push_back(i + 5);
    }

    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);
    v.push_back(v5);

    for(vector<vector<int>>::iterator it = v.begin(); it < v.end(); it++)
    {
        for(vector<int>::iterator it_= (*it).begin(); it_ < (*it).end(); it_++)
        {
            cout << *it_ << " ";
        }
        cout << endl;
    }
}


//string 容器
void test40()
{
    string s1;//默认构造 空字符串

    const char* str = "hello world";
    string s2(str);//使用str初始化
    cout << s2 << endl;

    string s3(s2);//拷贝构造
    cout << s3 << endl;

    string s4(10, 'a');//10个'a'
    cout << s4 << endl;

}


//string 赋值操作

void test50()
{
    string str1;
    str1 = "hello world";// = 重载
    cout << str1 << endl;

    string str2;
    str2 = str1;// = 号重载
    cout << str2 << endl;

    string str4;
    str4 = 'a';
    cout << str4 << endl;

    string str5;
    str5.assign("hello c++");
    cout << str5 << endl;

    string str6;
    str6.assign("hello c++", 5);//把前5个字符赋值给str6
    cout << str6 << endl;

    string str7;
    str7.assign(10, 'a');//10个'a'
    cout << str7 << endl;

    string str8;
    str8.assign(str7);//将 str7 赋值给 str8
    cout << str8 << endl;
 }


//string 字符串拼接
void test60()
{
    string str1 = "i";
    str1 += " like ";
    cout << str1 << endl;

    str1 += 'a';
    cout << str1 << endl;

    string str2 = " girl";
    str1 += str2;
    cout << str1 << endl;


    string str3 = "I";
    str3.append(" love ");
    str3.append("playaaaaa", 4);
    string str4 = "games.";
    str3.append(str4);
    cout << str3 <<endl;
}

//string 查找 替换

void test70()
{
    //查找
    string str1 = "abcdefgde";
    int pos = str1.find("de");
    cout << pos << endl;//3 从左往右查找 首次发现的位置 从0开始计数 没找到返回-1

    pos = str1.rfind("de");
    cout << pos << endl;//7 从右往左查找 首次发现的位置

    //替换
    str1.replace(1, 3, "------");//区间替换
    cout << str1 << endl;
}

//string字符串比较
void test80()
{
    string str1 = "hello";
    string str2 = "hello";

    if(str1.compare(str2) == 0)
    {
        cout << "str1 == str2" <<endl;
    }
    else if (str1.compare(str2) > 0)
    {
        cout << "str1 > str2" <<endl;
    }
    else
    {
        cout << "str1 < str2" <<endl;
    }
}

//字符存取
void test90()
{
    string str = "hello";

    for(int i = 0; i < str.size(); i++)
    {
        cout << str[i] << " ";
    }
    cout << endl;

    for(int i = 0; i < str.size(); i++)
    {
        cout << str.at(i) << " ";
    }
    cout << endl;

    //修改单个字符
    str[0] = 'x';
    cout << str << endl;

    str.at(0) = 'h';
    cout << str << endl;
}

int main()
{
    //vector 容器简单操作
    //test10();

    //vector 容器存放自定义类型
    //test20();

    //容器嵌套容器
    //test30();

    //string 容器
    //test40();

    //string 赋值操作
    //test50();


    //string 字符串拼接
    //test60();

    //string 查找
    //test70();

    //string 比较
    //test80();

    //string 字符存取
    test90();

    return 0;
}